class Cart < ActiveRecord::Base
  
  has_many :cart_items, :include => :product, :dependent => :delete_all
  has_many :products, :through => :cart_items


  # Voeg een product toe.
  def add_product(product, quantity)
    
    raise 'Negative quantity' if quantity < 0
    
    cart_item = cart_items.first( :conditions => ['product_id = ?', product.id] )

    if cart_item == nil
      cart_items.create( :product_id => product.id, :quantity => quantity )
    else
      update_product_quantity(product, cart_item.quantity + quantity)
    end
  end


  # Verwijder een product.
  def remove_product(product)
    cart_item = cart_items.first( :conditions => ['product_id = ?', product.id] )

    if cart_item != nil
      cart_item.destroy
    end
  end


  # Verander de hoeveelheid van een product
  def update_product_quantity(product, new_quantity)

    raise 'Negative quantity' if new_quantity < 0

    cart_item = cart_items.first( :conditions => ['product_id = ?', product.id] )

    if cart_item != nil
      cart_item.update_attribute(:quantity, new_quantity)
    else
      add_product(product, new_quantity)
    end
  end


  # Tel het aantal producten in het winkelwagentje. Dus niet het aantal
  # unieke producten, maar het totale aantal producten.
  def total_products
    total = 0

    cart_items.each do |item|
      total += item.quantity
    end

    return total
  end

  # Bereken de totale prijs alle producten in het winkelwagentje.
  # Deze prijs is nog zonder verzendkosten.
  def total_cost
    cost = 0

    cart_items.each do |item|
      cost += item.total_cost
    end

    return cost
  end

  # Zijn alle producten in dit winkelwagentje op voorraad?
  def products_in_stock?

    cart_items.each do |item|
      return false unless item.product_in_stock?
    end

    return true
  end


  # Is dit winkelwagentje leeg?
  def is_empty   
    return cart_items.size == 0
  end
end
